package com.xyazm.order.dao;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xyazm.common.dao.BaseDAO;
import com.xyazm.common.enums.OrderStatusEnum;
import com.xyazm.order.domain.dto.OrderListDTO;
import com.xyazm.order.domain.dto.QueryOrderListDTO;
import com.xyazm.order.domain.entity.OrderInfoDO;
import com.xyazm.order.enums.DeleteStatusEnum;
import com.xyazm.order.mapper.OrderInfoMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.stream.Collectors;

/**
 * 订单信息
 * @author xuyou
 * @date 2022年05月14日 22:46
 */
@Repository
@Slf4j
public class OrderInfoDAO extends BaseDAO<OrderInfoMapper, OrderInfoDO> {

    /**
     * 根据订单号查询订单
     * @author xuyou
     * 2022/6/6 0006 22:08
     * @param orderId
     * @return OrderInfo
    */
    public OrderInfoDO getByOrderId(String orderId) {
        LambdaQueryWrapper<OrderInfoDO> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(OrderInfoDO::getOrderId, orderId);
        return getOne(queryWrapper);
    }

    public boolean updateOrderInfo(OrderInfoDO orderInfoDO) {
        UpdateWrapper<OrderInfoDO> updateWrapper = new UpdateWrapper<>();
        updateWrapper.eq("order_id", orderInfoDO.getOrderId());
        return update(orderInfoDO, updateWrapper);
    }

    /**
     * 根据父订单号查询子订单号
     * @param orderId
     * @return
     */
    public List<OrderInfoDO> listByParentOrderId(String orderId) {
        LambdaQueryWrapper<OrderInfoDO> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(OrderInfoDO::getParentOrderId, orderId);
        return list(queryWrapper);
    }

    /**
     * 统计子订单数量
     * @param orderId
     * @return
     */
    public List<String> listSubOrderIds(String orderId) {
        LambdaQueryWrapper<OrderInfoDO> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.select(OrderInfoDO::getOrderId);
        queryWrapper.eq(OrderInfoDO::getParentOrderId, orderId);
        return list(queryWrapper).stream().map(OrderInfoDO::getOrderId).collect(Collectors.toList());
    }

    /**
     * 根据订单号查询订单号
     * @param orderIds
     * @return
     */
    public List<OrderInfoDO> listByOrderIds(List<String> orderIds) {
        LambdaQueryWrapper<OrderInfoDO> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.in(OrderInfoDO::getOrderId, orderIds);
        return list(queryWrapper);
    }

    /**
     * 软删除订单
     * @param ids 订单主键id
     */
    public void softRemoveOrders(List<Long> ids) {
        LambdaUpdateWrapper<OrderInfoDO> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.set(OrderInfoDO::getDeleteStatus, DeleteStatusEnum.YES.getCode())
                .in(OrderInfoDO::getId, ids);
        this.update(updateWrapper);
    }

    /**
     * 更新订单状态
     * @author xuyou
     * @date: 2022/6/23 17:44
     * @param: orderId 订单号
     * @param: fromStatus 订单原状态
     * @param: toStatus 订单最新状态
     * @return: boolean 更新结果
     */
    public boolean updateOrderStatus(String orderId,Integer fromStatus,Integer toStatus) {
        LambdaUpdateWrapper<OrderInfoDO> updateWrapper = new LambdaUpdateWrapper<>();

        updateWrapper.set(OrderInfoDO::getOrderStatus,toStatus)
                .eq(OrderInfoDO::getOrderId,orderId)
                .eq(OrderInfoDO::getOrderStatus,fromStatus);

        return update(updateWrapper);
    }

    /**
     * 查询订单列表
     * @author xuyou
     * @date: 2022/6/24 14:47
     * @param: query
     */
    public Page<OrderListDTO> listByPage(QueryOrderListDTO query) {
        // 设置分页条件
        Page<OrderListDTO> page = new Page<>(query.getPageNo(), query.getPageSize());
        return baseMapper.listByPage(page, query);
    }

    /**
     * 更新订单拓展信息
     * @author xuyou
     * @date: 2022/7/6 16:04
     */
    public void updateOrderExtJson(String orderId, String extJsonStr) {
        LambdaUpdateWrapper<OrderInfoDO> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.set(OrderInfoDO::getExtJson, extJsonStr)
                .eq(OrderInfoDO::getOrderId, orderId);
        update(updateWrapper);
    }

    /**
     * 扫描所有未支付订单
     * @author xuyou
     * 2022/7/24 0024 12:26
    */
    public List<OrderInfoDO> listAllUnPaid() {
        LambdaQueryWrapper<OrderInfoDO> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.in(OrderInfoDO::getOrderStatus, OrderStatusEnum.unPaidStatus());
        return list(queryWrapper);
    }

    /**
     * 根据父订单号更新订单
     * @param orderInfoDO
     * @param orderIds
     * @return
     */
    public boolean updateBatchByOrderIds(OrderInfoDO orderInfoDO, List<String> orderIds) {
        LambdaUpdateWrapper<OrderInfoDO> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.in(OrderInfoDO::getOrderId, orderIds);
        return update(orderInfoDO, updateWrapper);
    }

    /**
     * 根据订单号更新订单
     * @param orderInfoDO
     * @param orderId
     * @return
     */
    public boolean updateByOrderId(OrderInfoDO orderInfoDO, String orderId) {
        LambdaUpdateWrapper<OrderInfoDO> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.eq(OrderInfoDO::getOrderId, orderId);
        return update(orderInfoDO, updateWrapper);
    }

    /**
     * 根据orderId查询全部主单和子单
     */
    public List<OrderInfoDO> getAllByOrderId(String orderId) {
        LambdaQueryWrapper<OrderInfoDO> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(OrderInfoDO::getOrderId, orderId)
                .or()
                .eq(OrderInfoDO::getParentOrderId, orderId);
        return list(queryWrapper);
    }
}
